package cn.edu.hyit.hjq.volunteems.backend.controller;

import cn.edu.hyit.hjq.volunteems.backend.dto.reault.JsonResult;
import cn.edu.hyit.hjq.volunteems.backend.dto.request.LoginRequest;
import cn.edu.hyit.hjq.volunteems.backend.dto.request.RegisterRequest;
import cn.edu.hyit.hjq.volunteems.backend.pojo.User;
import cn.edu.hyit.hjq.volunteems.backend.service.UserService;

import org.apache.ibatis.annotations.Update;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户控制器
 *
 * @module 用户服务
 */
@RestController
@RequestMapping("/user")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 用户注册接口
     * 用于处理用户注册请求，包含用户名、密码等用户信息
     *
     * @param registerRequest 用户注册请求参数，包含必要的用户信息
     * @return JsonResult<String> 返回操作结果，成功时返回200
     */
    @PostMapping("/auth/register")
    public JsonResult<?> registerUser(@RequestBody RegisterRequest registerRequest) {
        // 调用注册并登录方法，传入 request 用于构造 Authentication
        return userService.registerUser(registerRequest);
    }

    /**
     * 用户登录接口
     * 用于处理用户登录请求，包含用户名、密码等用户信息
     *
     * @param loginRequest 用户登录请求参数，包含必要的用户信息
     * @return JsonResult<String> 返回操作结果，成功时返回 JWT 令牌
     */
    @PostMapping("/auth/login")
    public JsonResult<String> login(@RequestBody LoginRequest loginRequest) {
        return userService.authenticateUser(loginRequest.getUsername(), loginRequest.getPassword());
    }

    /**
     * 获取用户列表接口
     * 用于获取所有用户列表
     *
     * 需要提供有效的 JWT Token 进行身份验证，请求头示例：
     * Authorization: Bearer <token>
     *
     * @return JsonResult<List<User>> 返回包含用户列表的结果对象
     */
    @GetMapping("/list")
    @PreAuthorize("hasRole('ADMIN')") // 只有 ADMIN 角色可以访问
    public JsonResult<List<User>> getUserList() {
        return userService.getUserList();
    }

    /**
     * 通过用户ID将用户状态改为通过
     *
     * @param userId 用户ID
     * @return JsonResult<String> 响应结果
     */
    @PatchMapping("/status/pass")
    @PreAuthorize("hasRole('ADMIN')")
    public JsonResult<String> passUser(@RequestParam String userId) {
        return userService.ConvertUser(userId);
    }

    /**
     * 通过用户ID将用户状态改为拒绝
     *
     * @param userId 用户ID
     * @return JsonResult<String> 响应结果
     */
    @PatchMapping("/status/reject")
    @PreAuthorize("hasRole('ADMIN')")
    public JsonResult<String> rejectUser(@RequestParam String userId) {
        return userService.ConvertUser(userId);
    }

}
